﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using GS1.Configuration;
using GS1.Library;
using System.Windows.Forms;
using System.Drawing;
using System.Text.RegularExpressions;
using ServirMovil.Herramientas;
using System.IO;
using System.Reflection;
using GS1.Tools.Extender;

namespace ServirMovil.Clases.Movil
{
    /// <summary>
    /// <para>Clase       : MetodosAplicacion</para>
    /// <para>Descripcion : Contiene todos las funciones necesarias para la App</para>
    /// <para>Autor       : Pedro Miguel Vera Rafael (pedro.verarafael@gmail.com)</para>
    /// <para>Fecha       : 15/01/2013</para>
    /// <para>Empresa     : GS1 Peru</para>
    /// </summary>
    /// <remarks>
    /// </remarks>
    /// <history>
    /// 	[Pedro Miguel Vera Rafael]	15/01/2013	Created
    /// </history>
    public class MetodosAplicacion
    {
        #region --- Carga Inicial ---
        public static void leerXML()
        {
            //------------------------------------------------------------------------------
            // Parametros de Base de Datos
            ParametrosAplicacion.STR_RUTABASEDATOS = ConfigurationManager.GetConfig("RUTA") + Util.AddSlash(ConfigurationManager.GetConfig("DIRECTORIO")) + ConfigurationManager.GetConfig("BASEDATOS");
            //------------------------------------------------------------------------------
            ParametrosAplicacion.STR_RUTA = ConfigurationManager.GetConfig("RUTA");
            ParametrosAplicacion.STR_DATABASE_PATH = ConfigurationManager.GetConfig("DIRECTORIO");
            ParametrosAplicacion.STR_DATABASE_FILE = ConfigurationManager.GetConfig("BASEDATOS");
            ParametrosAplicacion.STR_SCRIPT_DATABASE = ConfigurationManager.GetConfig("SCRIPT");
            //------------------------------------------------------------------------------
            // Parametros
            ParametrosAplicacion.URLWS = ConfigurationManager.GetConfig("URLWS");
            ParametrosAplicacion.TIEMPOFUERA = Convert.ToInt32(ConfigurationManager.GetConfig("TIEMPOFUERA"));
            ParametrosAplicacion.CARACTERESNOVALIDOS = ConfigurationManager.GetConfig("CARACTERESINVALIDOS");
            //------------------------------------------------------------------------------
            // Otros
            ParametrosAplicacion.ID_TERMINAL = ConfigurationManager.GetConfig("IDTERMINAL");
            ParametrosAplicacion.CREARLOG = Convert.ToInt32(ConfigurationManager.GetConfig("CREARLOG"));
            //------------------------------------------------------------------------------
            // POTENCIA LECTOR RFID
            ParametrosAplicacion.POTENCIA_LECTURA = Convert.ToInt32(ConfigurationManager.GetConfig("POTENCIALECTURA"));
            ParametrosAplicacion.POTENCIA_GRABADO = Convert.ToInt32(ConfigurationManager.GetConfig("POTENCIAGRABADO"));
            //------------------------------------------------------------------------------
            // PASSWORDS DE TAG RFID
            ParametrosAplicacion.ACCESSPWD = ConfigurationManager.GetConfig("ACCESSPWD");
            ParametrosAplicacion.KILLPWD = ConfigurationManager.GetConfig("KILLPWD");
            //------------------------------------------------------------------------------
            // PERFILES AUTORIZADOS  PARA PRESTAMOS
            ParametrosAplicacion.PERFIL_AUTORIZADO1 = Convert.ToInt32(ConfigurationManager.GetConfig("PERFILPRESTAMO1"));
            ParametrosAplicacion.PERFIL_AUTORIZADO2 = Convert.ToInt32(ConfigurationManager.GetConfig("PERFILPRESTAMO2"));
        }
        #endregion

        #region --- Procedimientos Generales ---
        public static void caracteresEspeciales(KeyPressEventArgs tecla)
        {
            int posicion = 0;
            posicion = ParametrosAplicacion.CARACTERESNOVALIDOS.IndexOf(tecla.KeyChar);
            if (posicion > 0) tecla.Handled = true;
        }

        public static void soloAlfanumericos(KeyPressEventArgs tecla)
        {
            if (tecla.KeyChar == (char)Keys.Back) { return; }
            if (tecla.KeyChar == (char)Keys.Tab) { return; }
            if (tecla.KeyChar == (char)Keys.Enter) { return; }

            bool esAlfanumerico = false;
            Regex regex = null;
            regex = new Regex(Constantes.CARACTERESALFANUMERICOS);

            esAlfanumerico = regex.IsMatch(tecla.KeyChar.ToString().ToUpper());

            if (!esAlfanumerico) { tecla.Handled = true; }
        }

        public static void soloNumericos(KeyPressEventArgs tecla)
        {
            if (tecla.KeyChar == (char)Keys.Back) { return; }
            if (tecla.KeyChar == (char)Keys.Tab) { return; }
            if (tecla.KeyChar == (char)Keys.Enter) { return; }

            bool esAlfanumerico = false;
            Regex regex = null;
            regex = new Regex(Constantes.CARACTERESNUMERICOS);

            esAlfanumerico = regex.IsMatch(tecla.KeyChar.ToString().ToUpper());

            if (!esAlfanumerico) { tecla.Handled = true; }
        }

        public static void crearSuceso(string suceso)
        {
            if (ParametrosAplicacion.CREARLOG != 1) return; // sale y no escribe el archivo Log

            StreamWriter flujoEscritura;
            string logDirectorio = @"\Temp\Logs";
            string logSeparador = "@";
            string fecha = DateTime.Now.ToString("yyyyMMdd");
            string archivoLog = logDirectorio + @"\" + "SC_" + fecha + ".fvn";

            if (!Directory.Exists(logDirectorio)) Directory.CreateDirectory(logDirectorio);

            if (!(File.Exists(archivoLog)))
            {
                flujoEscritura = new StreamWriter(archivoLog, false, Encoding.Default);
                flujoEscritura.WriteLine("SUCESO" + logSeparador +
                                         "FECHAHORA");
            }
            else
            {
                flujoEscritura = new StreamWriter(archivoLog, true, System.Text.Encoding.Default);
            }

            flujoEscritura.WriteLine(suceso + logSeparador +
                                     DateTime.Now.ToString("yyyyMMdd HH:mm:ss"));

            flujoEscritura.Flush();
            flujoEscritura.Close();
            flujoEscritura.Dispose();
        }
        #endregion

        #region --- Disenio Formularios ---
        public static void setearGrillaColorFondo(DataGrid dg, Color color)
        {
            object renderer = typeof(DataGrid).GetField("m_renderer", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance).GetValue(dg);
            renderer.GetType().GetField("m_brushEmptyBack", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(renderer, new SolidBrush(color));
        }

        public static void configuraFormulario(Form frmFormulario, Panel titulo, Panel body, Panel pie)
        {
            int iAnchoOriginal = 240; //MC1000

            frmFormulario.Width = Screen.PrimaryScreen.Bounds.Width;
            frmFormulario.Height = Screen.PrimaryScreen.Bounds.Height;

            titulo.Width = frmFormulario.Width;
            body.Width = titulo.Width;
            pie.Width = titulo.Width;

            foreach (Control control in body.Controls)
            {
                if (control is System.Windows.Forms.PictureBox)
                {
                    control.Width = (control.Left + control.Width) * (body.Width / iAnchoOriginal) - control.Left;
                }
                if (control is System.Windows.Forms.TextBox | control is System.Windows.Forms.ComboBox)
                {
                    control.Width = (control.Left + control.Width) * (body.Width / iAnchoOriginal) - control.Left;
                    control.Font = new System.Drawing.Font("Microsoft Sans Serif", 12.0F, System.Drawing.FontStyle.Bold);
                }
                if (control is System.Windows.Forms.DataGrid)
                {
                    control.Width = (control.Left + control.Width) * (body.Width / iAnchoOriginal) - (control.Left + 3);
                    control.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.75F, System.Drawing.FontStyle.Bold);
                }
                //If TypeOf oControl Is OpenNETCF.Windows.Forms.ButtonEx Then
                //    oControl.Width = (oControl.Left + oControl.Width) * (body.Width / iAnchoOriginal) - oControl.Left
                //    oControl.Font = New System.Drawing.Font("Microsoft Sans Serif", 16.0!, System.Drawing.FontStyle.Bold)
                //End If
            }

            pie.Top = frmFormulario.Height - pie.Height;
            body.Top = titulo.Height; //+ (pie.Top - body.Height - titulo.Height) / 2
            body.Height = frmFormulario.Height - (titulo.Height + pie.Height);


            if (GS1.SystemInfoExv.IsPocketPc)
            {
                //Solo para Pocket Pc o Windows Mobile x
                frmFormulario.WindowState = FormWindowState.Maximized;
            }

            switch (GS1.SystemInfoExv.ObtenerPlataforma)
            {
                case GS1.SystemInfoExv.Platform.WindowsCE:
                    break;
                case GS1.SystemInfoExv.Platform.PocketPC:
                    break;
                case GS1.SystemInfoExv.Platform.WindowsMobile:
                    break;
            }
        }

        public static void configuraFormulario(Form frmFormulario)
        {
            // Oculta teclado
            if (ParametrosAplicacion.TECLADO != null) ParametrosAplicacion.TECLADO.Visible = false;

            // Establecer cursor por defecto
            Cursor.Current = Cursors.Default;

            // Oculta el titulo del formulario
            frmFormulario.FormBorderStyle = FormBorderStyle.None;
            frmFormulario.AutoScroll = false;

            // Establece el tamanio del formulario
            frmFormulario.Width = Screen.PrimaryScreen.Bounds.Width;
            frmFormulario.Height = Screen.PrimaryScreen.Bounds.Height;

            // Se establece el estado del formulario dependiente del tipo de S.O
            switch (GS1.SystemInfoExv.ObtenerPlataforma)
            {
                case GS1.SystemInfoExv.Platform.WindowsCE:
                    frmFormulario.WindowState = FormWindowState.Normal;
                    break;
                case GS1.SystemInfoExv.Platform.PocketPC:
                    frmFormulario.WindowState = FormWindowState.Maximized;
                    break;
                case GS1.SystemInfoExv.Platform.WindowsMobile:
                    frmFormulario.WindowState = FormWindowState.Maximized;
                    break;
                case GS1.SystemInfoExv.Platform.Unknown:
                    frmFormulario.WindowState = FormWindowState.Normal;
                    break;
            }

            frmFormulario.Show();
            //frm.Refresh();
        }

        public static void aplicarEstiloGrilla(ListView lvwListado, Form frmFormulario)
        {
            ListViewExv estiloListView = null;

            lvwListado.FullRowSelect = true;

            estiloListView = new ListViewExv(lvwListado, frmFormulario);
            estiloListView.SetGridLines();
        }
        #endregion

        #region --- Controlar Teclado ---
        public static void tecladoVisible(Panel pnlControl, TextBox txtControl)
        {
            int altoPantalla = Screen.PrimaryScreen.Bounds.Height;
            int anchoPantalla = Screen.PrimaryScreen.Bounds.Width;
            int top = 0;
            int left = 0;

            ParametrosAplicacion.TECLADO.Visible = !ParametrosAplicacion.TECLADO.Visible;

            if (ParametrosAplicacion.TECLADO.Visible)
            {
                if ((pnlControl.Top + pnlControl.Height + 140 > altoPantalla))
                {
                    top = pnlControl.Top - 85;
                }
                else
                {
                    top = pnlControl.Top + pnlControl.Height + 25;
                }
                ParametrosAplicacion.TECLADO.SetPosition(top, left);
            }

            txtControl.Focus();
        }

        public static void tecladoVisible(TabControl tabControl, TextBox txtControl)
        {
            int altoPantalla = Screen.PrimaryScreen.Bounds.Height;
            int anchoPantalla = Screen.PrimaryScreen.Bounds.Width;
            int top = 0;
            int left = 0;

            ParametrosAplicacion.TECLADO.Visible = !ParametrosAplicacion.TECLADO.Visible;

            if (ParametrosAplicacion.TECLADO.Visible)
            {
                if ((tabControl.Top + tabControl.Height + 140 > altoPantalla))
                {
                    top = tabControl.Height - 10;
                }
                else
                {
                    top = tabControl.Top + tabControl.Height + 50;
                }
                ParametrosAplicacion.TECLADO.SetPosition(top, left);
            }

            txtControl.Focus();
        }

        public static void tecladoVisible(TextBox txtControl)
        {
            int altoPantalla = Screen.PrimaryScreen.Bounds.Height;
            int anchoPantalla = Screen.PrimaryScreen.Bounds.Width;
            int top = 0;
            int left = 0;

            ParametrosAplicacion.TECLADO.Visible = !ParametrosAplicacion.TECLADO.Visible;

            if (ParametrosAplicacion.TECLADO.Visible)
            {
                if ((txtControl.Top + txtControl.Height + 140 > altoPantalla))
                {
                    top = txtControl.Top - 85;
                    //If txtControl.Left + 210 > iAnchoPantalla Then
                    //    iLeft = txtControl.Left - 85
                    //Else
                    //    iLeft = txtControl.Left
                    //End If
                }
                else
                {
                    top = txtControl.Top + txtControl.Height + 25;
                    //If txtControl.Left + 210 > iAnchoPantalla Then
                    //    iLeft = txtControl.Left - 85
                    //Else
                    //    iLeft = txtControl.Left
                    //End If
                }
                ParametrosAplicacion.TECLADO.SetPosition(top, left);
            }

            txtControl.Focus();
        }

        public static void tecladoVisible(Control control)
        {
            int altoPantalla = Screen.PrimaryScreen.Bounds.Height;
            int anchoPantalla = Screen.PrimaryScreen.Bounds.Width;
            int top = 0;
            int left = 0;

            ParametrosAplicacion.TECLADO.Visible = !ParametrosAplicacion.TECLADO.Visible;

            if (ParametrosAplicacion.TECLADO.Visible)
            {
                if ((control.Top + control.Height + 140 > altoPantalla))
                {
                    top = control.Top - 85;
                    //If txtControl.Left + 210 > iAnchoPantalla Then
                    //    iLeft = txtControl.Left - 85
                    //Else
                    //    iLeft = txtControl.Left
                    //End If
                }
                else
                {
                    top = control.Top + control.Height + 25;
                    //If txtControl.Left + 210 > iAnchoPantalla Then
                    //    iLeft = txtControl.Left - 85
                    //Else
                    //    iLeft = txtControl.Left
                    //End If
                }
                ParametrosAplicacion.TECLADO.SetPosition(top, left);
            }

            control.Focus();
        }
        #endregion

        #region --- Generar EPC ---
        private static string empresaServir = "7756080";

        public static string generarEPC_Expediente(string idExpediente,
                                                   string nroTomo,
                                                   string nroImpresion)
        {
            string epcGenerado = string.Empty;

            string binCabecera = "00111010"; // 8
            string binFiltro = "000"; // 3
            string binParticion = "101"; // 3

            string binEmpresa = decimalToBinario(Convert.ToInt32(empresaServir)).PadLeft(24, '0');
            string binTipoDocumento = decimalToBinario(1).PadLeft(17, '0');
            string binIdExpediente = decimalToBinario(Convert.ToInt32(idExpediente)).PadLeft(58, '0');
            string binNroTomo = decimalToBinario(Convert.ToInt32(nroTomo)).PadLeft(7, '0');
            string binNroReimpresion = decimalToBinario(Convert.ToInt32(nroImpresion)).PadLeft(8, '0');

            epcGenerado = binCabecera +
                          binFiltro +
                          binParticion +
                          binEmpresa +
                          binTipoDocumento +
                          binIdExpediente +
                          binNroTomo +
                          binNroReimpresion;

            // Convertir de Binario a Hexadecimal
            epcGenerado = GS1.PsionRFID.TipoDato.LLRPBitArray.FromBinString(epcGenerado).ToHexString();

            return epcGenerado;
        }

        public static string obtenerIdEPC_Expediente(string epc)
        {
            return string.Empty;
        }

        public static string decimalToBinario(int numero)
        {
            string binario = string.Empty;
            while (numero != 0)
            {
                if ((numero % 2) == 1)
                {
                    binario = "1" + binario;
                }
                else
                {
                    binario = "0" + binario;
                }
                numero = numero / 2;
            }
            if (binario.Equals(string.Empty)) binario = "0000";

            while ((binario.Length % 4) != 0)
            {
                binario = "0" + binario;
            }

            return binario;
        }
        #endregion

        #region --- Validar EPC ---
        public static bool esEtiquetaValida(string epc)
        {
            string cabecera = epc.Substring(0, 2);
            return cabecera.Equals(ParametrosAplicacion.IDENTIFICADOR_CAB_ETIQUETA);
        }
        #endregion
    }
}
